home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / flex-2.5 / flex-2 / flex-2.5.3 / MISC / VMS / mkskel.tpu < prev    next >
Encoding:
Text File  |  1995-01-09  |  2.0 KB  |  46 lines

  1. !  mkskel.tpu
  2. !       usage:
  3. !  edit/TPU/noDisplay/noSection/Command=mkskel.tpu flex.skl /Output=skel.c
  4. !
  5. !  Create a C source file from the flex skeleton data.  Copy the file,
  6. !       changing backslash (\) to doubled backslash (\\) and quote (")
  7. !       to backslash quote (\").  For each line, insert space+space+quote
  8. !       at the beginning and quote+comma at the end.  Bracket the updated
  9. !       text with several lines of prologue and epilogue.
  10. !
  11.    skelfile := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
  12.    SET(NO_WRITE, skelfile);
  13.    target := '"' | '\';                         !do this once, outside loops
  14.    POSITION(BEGINNING_OF(skelfile));            !start here
  15.    rest_of_line := CREATE_RANGE(MARK(NONE), MARK(NONE));  !also outside loops
  16.    LOOP
  17.       EXITIF MARK(NONE) = END_OF(skelfile);     !are we done yet?
  18.       COPY_TEXT('  "');  start_pos := MARK(NONE);
  19.       POSITION(LINE_END);  end_pos := MARK(NONE);
  20.       MODIFY_RANGE(rest_of_line, start_pos, end_pos);
  21.       LOOP
  22.      next_match := SEARCH_QUIETLY(target, FORWARD, EXACT, rest_of_line);
  23.      EXITIF next_match = 0;
  24.      POSITION(BEGINNING_OF(next_match));
  25.      COPY_TEXT('\');  MOVE_HORIZONTAL(1);   !past the matched character
  26.      MODIFY_RANGE(rest_of_line, MARK(NONE), end_pos);
  27.       ENDLOOP;
  28.       POSITION(LINE_END);  COPY_TEXT('",');
  29.       MOVE_VERTICAL(1);  POSITION(LINE_BEGIN);  !go to next line
  30.    ENDLOOP;
  31.  
  32.    POSITION(BEGINNING_OF(skelfile));            !insert five line prologue
  33.    COPY_TEXT('/* File created from flex.skl via mkskel.tpu */');   SPLIT_LINE;
  34.                                    SPLIT_LINE;
  35.    COPY_TEXT('#include "flexdef.h"');                              SPLIT_LINE;
  36.                                    SPLIT_LINE;
  37.    COPY_TEXT('const char *skel[] = {');                            SPLIT_LINE;
  38.  
  39.    POSITION(END_OF(skelfile));                  !append two line epilogue
  40.    COPY_TEXT('  0');                                               SPLIT_LINE;
  41.    COPY_TEXT('};');                                             !! SPLIT_LINE;
  42.  
  43.    WRITE_FILE(skelfile, GET_INFO(COMMAND_LINE, "output_file"));
  44.    QUIT
  45. !--<eof>--
  46.